
import path from 'path';
import * as vscode from 'vscode';
import { getHtmlForWebview } from '../utils/createHtml'
import { Language } from '../interfaces/Language'
import { Words } from '../interfaces/Words'
import { languageTypeList } from '../utils/languageDic'
export abstract class BaseI18nHandler {

    /* 私有 */
    private _config: vscode.WorkspaceConfiguration;//配置信息

    /* 公有 */
    public context: vscode.ExtensionContext | undefined;//上下文内容
    public webviewPanel: vscode.WebviewPanel | undefined;//webview面板
    public fileContent: string | undefined;             //文件内容
    public currentTextDocumentFileUri: vscode.Uri | undefined;//当前打开的文件uri配置
    public projectRootPath: string | undefined = '';        //项目根目录
    public localesFullPath: string;//i18n翻译内容存放位置
    public words: Words[] = [];//页面解析出来的   汉字数组[]
    /* settings配置的 */
    public appID: string | undefined = '';//百度翻译id
    public appToken: string | undefined = '';//百度翻译appToken
    public localesPath: string | undefined = '';//存放位置
    public languages: Language[] = [];//语言配置,言当前语言

    constructor(context: vscode.ExtensionContext) {

        vscode.window.showInformationMessage('欢迎使用easy-vuei18n插件！');
        this._config = vscode.workspace.getConfiguration();
        let activeTextEditor = vscode.window?.activeTextEditor;

        /**
         * vscode.window.activeTextEditor 获取当前活动的文本编辑器对象。
            返回值：
                document：当前编辑器的文档对象。
                selection：当前编辑器的选中文本。
                visibleRanges：当前编辑器的可见区域。
                fileName：当前编辑器的文件名。
                language：当前编辑器的语言。
                version：当前编辑器的版本。
         * 
         */
        this.context = context
        this.fileContent = activeTextEditor?.document.getText() || this.fileContent //当前文本
        this.currentTextDocumentFileUri = activeTextEditor?.document.uri;       //当前文本路径配置
        this.projectRootPath = vscode.workspace.workspaceFolders?.[0]?.uri?.fsPath;  //文件的文件系统路径。
        this.localesFullPath = path.join(this.projectRootPath, this.localesPath) //i18n存放位置
        // 找不到项目位置
        if (!this.currentTextDocumentFileUri || !this.projectRootPath) {
            return;
        }
        if (!this.getUserSettings()) { return }
        this.languages = this._initlangeuage()

        vscode.window.showInformationMessage('基本配置打印', activeTextEditor.document.uri, '--')
        this.words = this.getChineseWords()

        // 页面中没有中文
        if (!this.words.length) {
            return
        }
        this.openWordsPage()
    }
    /**
     * 替换文本
     * 
     */

    /**
     * 获取并检查用户配置
     */

    public getUserSettings() {
        this.appID = this._config.get('easy-vuei18n-yp.Baidu App Id') as string;
        if (!this.appID) {
            vscode.window.showErrorMessage("请先参考使用文档设置百度app id");
        }
        this.appToken = this._config.get('easy-vuei18n-yp.Baidu App Id') as string;
        if (!this.appToken) {
            vscode.window.showErrorMessage("请先参考使用文档设置百度app token");
        }
        this.localesPath = this._config.get('easy-vuei18n-yp.Locales Path') as string;
        if (!this.localesPath) {
            vscode.window.showErrorMessage("请先参考使用文档设置存在国际化文件的文件夹地址。");
        }
        this.languages = this._config.get('easy-vuei18n-yp.languages') as Array<string>;
        return !!this.appID && !!this.appToken && !!this.localesPath
    }

    /**
     * 自定义页面
     * 
     */
    private openWordsPage() {
        /**
         * 'testWebview', // viewType
        "WebView演示", // 视图标题
        vscode.ViewColumn.One, // 显示在编辑器的哪个部位
        {
            enableScripts: true, // 启用JS，默认禁用
            retainContextWhenHidden: true, // webview被隐藏时保持状态，避免被重置
        }
         */
        // 1.创建容器
        // 获取当前编辑器的视图列
        const columnToShowIn = vscode.window.activeTextEditor
            ? vscode.window.activeTextEditor.viewColumn
            : vscode.ViewColumn.Active;

        // 如果webviewPanel不存在，则创建一个
        if (!this.webviewPanel) {
            this.webviewPanel = vscode.window.createWebviewPanel('translate',
                "中文列表",
                columnToShowIn,
                {
                    retainContextWhenHidden: true,
                    enableScripts: true
                });
        } else {
            // 如果webviewPanel存在，则显示它
            this.webviewPanel.reveal(columnToShowIn);
        }

        // 2. 当对象被销毁时触发清空
        this.webviewPanel.onDidDispose(() => {
            this.webviewPanel = undefined;
        });

        // 3. 建立页面内容
        this.webviewPanel.webview.html = getHtmlForWebview(this.context, this.words);

        // 4. 监听页面内容
        this.webviewPanel.webview.onDidReceiveMessage((e) => {

        })

    }
    /**
    * 初始化语言
    * 
    */
    _initlangeuage() {
        if (!this.languages || this.languages.length == 0) {
            return []
        }
        return this.languages.map(lang => {
            let [langType, localeFileName] = lang.split(':');

            if (!languageTypeList.includes(langType)) {
                vscode.window.showErrorMessage(`你配置的语言类型{${langType}}不在百度翻译支持的语言类型内，请检查是否输入错误。`);
                throw new Error();
            }

            // 兼容文件名和key同名的情况
            if (!localeFileName) {
                localeFileName = langType;
            }

            return {
                langType,
                localeFileName,
            };
        })
    }
    /**
     * 
     */
    didReceiveMessageHandle() { }
    /**
     * @babel/parse 解析成 ast
     * @babel/traverse ast进行便利
     * @babel/type 检查各个类型节点 
     */
    abstract getChineseWords()
}